package _99练习;

import java.awt.RenderingHints.Key;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Deque;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;

import javax.swing.plaf.basic.BasicInternalFrameTitlePane.IconifyAction;

import _01Collection接口.ForCollectionDemo;

public class Exercise {
	public static void main(String[] args) {

		// ---------------------------------------------------------
		// Iterator 练习
		// ---------------------------------------------------------
		// 5. 使用普通for循环显示遍历题目4 的l2
		// 使用加强for循环显示遍历题目4 的l2
		// 使用迭代器遍历显示题目4 的l2,并移除其中的E

		// ---------------------------------------------------------
		// Queue 练习
		// ---------------------------------------------------------

		// 7 编写一个医院、银行叫号系统
		// 取号()
		// 叫号()

		// 需要有一个队列保存排队信息
		// 需要有个变量保存当前最大号码是多少

		// 编写测试代码进行测试:
		// 编写一个死循环，循环随机调用取号或者叫号方法，等待500ms
		// 显示类似如下信息
		// 顾客取号,当前排队编号1，您前面还有0位顾客在等待
		// 顾客取号,当前排队编号2，您前面还有1位顾客在等待
		// 顾客取号,当前排队编号3，您前面还有2位顾客在等待
		// 窗口叫号,请编号为1的顾客到窗口.
		// 窗口叫号,请编号为2的顾客到窗口.
		// 顾客取号,当前排队编号4，您前面还有1位顾客在等待
		// 顾客取号,当前排队编号5，您前面还有2位顾客在等待
		// 窗口叫号,请编号为3的顾客到窗口.
		// 窗口叫号,请编号为4的顾客到窗口.
		// 窗口叫号,请编号为5的顾客到窗口.
		// 窗口叫号.当前没有顾客在等待
		// 窗口叫号.当前没有顾客在等待
		// 顾客取号,当前排队编号6，您前面还有0位顾客在等待
		// ...

		// BankSystem b = new BankSystem();
		// b.run();

		// 栈结构练习

		// 1. 小明往一个竹筒形状的容器里装了20个有编号(1-20的)球,一端开口一端封闭
		// 2. 然后取出3个球,
		// 3. 然后随机从已倒出的所有球中随机拿一个放回去
		// 4 循环执行2,3直到竹筒中全部倒出,倒空了就不塞回去了
		// 打印过程中的状况(取出的 竹筒中剩余的)

		// [1,2,3,..)

		// pop() *3
		// push()

		// (18,19,16,14,15,17,20)

		// ---------------------------------------------------------
		// Set (HashSet TreeSet)练习
		// ---------------------------------------------------------

		// 8
		// 1) 让用户输入数字，放入一个Set容器。总共需要有10个不同的数字。

		// 9 定义一个扑克牌类
		// 1) 随机得到10张不同的牌，放入HashSet容器
		// 2) 随机得到10张不同的牌，放入TreeSet容器
		// (排序依据:先按照花色，红桃黑桃方片草花，在按照数字大小从小到大)
		// Set<Poker> s1 = new HashSet<>();
		// while (s1.size() < 10)
		// {
		// Poker p = Poker.getCard();
		// s1.add(p);
		// }
		// System.out.println(s1);
		//
		// Set<Poker> s2 = new TreeSet<>();
		// while (s2.size() < 10)
		// {
		// Poker p = Poker.getCard();
		// s2.add(p);
		// }
		// System.out.println(s2);

		// 10
		// 让用户输入10个学生的学号 姓名 语文成绩 数学成绩 英语成绩 放入相应的集合容器
		// 1) 按照以下规则排序的集合容器
		// * 按照语文成绩从第到高排序
		// 2) 按照以下规则排序的集合容器
		// * 先按照总分从高到底排序
		// * 如果总分一致，按照语文成绩从高到底排序
		// * 如果语文一致，按照数学程序从高到底排序
		// * 如果数学也一致，按照学号从低到高排序

		// Comparator 接口
		// 创建讲一个 实现了 Comparator 接口 匿名内部类 对象
		//

		// Map 练习
		// ---------------------------------------------------------

		// 13. (Map练习)
		// 将以下信息放入Map容器
		// 书的编号 书名 书价
		// ISBN-001 iOS开发从入门到窒息 21.5
		// ISBN-002 Python从入门到出家 19.5
		// ISBN-003 Eclipse从安装的到卸载 15.6

		// 14. (Map练习)
		String str = "adfasdfer23cvt323446dfs23423sdfadhdsfg";
		// 一个包含英文字母及数字的长字符串，可以随便敲写字母
		// 统计字符串中字母及数字出现的次数，使用map保存
		// 打印并显示结果(输出时按照字母顺序输出)
		// 如下:
		// a 2个
		// b 9个
		//

		// 循环遍历str中每一个字符
		// result.put('a',2)

		// 15. 分别用List及Map并遍历输出
		// 存放以下信息
		// 高三1班
		// 1001 张三 97 65 77
		// 1002 李四 59 60 75
		// 1003 王五 75 83 08
		// 高三2班
		// 2001 刘备 45 75 60
		// 2002 关羽 79 80 53
		// 2003 孙权 97 99 100
		// 高三3班
		// 3001 周瑜 68 97 53
		// 3002 黄盖 99 98 80
		// 3003 鲁肃 100 75 65

		List<Student> l1 = new ArrayList<>();
		l1.add(new Student("高三1班", 1001, "张三", 97, 65, 77));
		l1.add(new Student("高三1班", 1002, "李四", 97, 65, 77));
		l1.add(new Student("高三1班", 1003, "王五", 75, 83, 80));
		l1.add(new Student("高三2班", 2001, "刘备", 45, 75, 60));
		l1.add(new Student("高三2班", 2002, "关羽", 79, 80, 53));
		l1.add(new Student("高三2班", 2003, "孙权", 97, 99, 100));
		l1.add(new Student("高三3班", 3001, "周瑜", 68, 97, 53));
		l1.add(new Student("高三3班", 3002, "黄盖", 99, 98, 80));
		l1.add(new Student("高三3班", 3003, "鲁肃", 100, 75, 65));

		for (int i = 0; i < l1.size(); i++) {
			System.out.println(l1.get(i));
		}

		Map<String, Student> m1 = new HashMap<>();
		m1.put("1", new Student("高三1班", 1001, "张三", 97, 65, 77));
		m1.put("2", new Student("高三1班", 1002, "李四", 97, 65, 77));
		m1.put("3", new Student("高三1班", 1003, "王五", 75, 83, 80));
		m1.put("4", new Student("高三2班", 2001, "刘备", 45, 75, 60));
		m1.put("5", new Student("高三2班", 2002, "关羽", 79, 80, 53));
		m1.put("6", new Student("高三2班", 2003, "孙权", 97, 99, 100));
		m1.put("7", new Student("高三3班", 3001, "周瑜", 68, 97, 53));
		m1.put("8", new Student("高三3班", 3002, "黄盖", 99, 98, 80));
		m1.put("9", new Student("高三3班", 3003, "鲁肃", 100, 75, 65));

		for (Map.Entry<String, Student> entry : m1.entrySet()) {
			System.out.println(entry.getValue());
		}
		//// List<String> classList = new ArrayList<>();
		//// classList.add("高三1班");
		//// classList.add("高三2班");
		//// classList.add("高三3班");
		////
		//// List<Student> stus1 = new ArrayList<>();
		//// List<Student> stus2 = new ArrayList<>();
		//// List<Student> stus3 = new ArrayList<>();
		//// List<List<Student>> stus = new ArrayList<>();
		//// stus.add(stus1);
		//// stus.add(stus2);
		//// stus.add(stus2);
		//
		// //
		// Map<Integer,Student> stus1 = new TreeMap<>();
		// Map<Integer,Student> stus2 = new TreeMap<>();
		// Map<Integer,Student> stus3 = new TreeMap<>();
		//
		// Map<String,Map<Integer,Student>> school= new HashMap();
		// school.put("高三1班",stus1);
		// school.put("高三2班",stus2);
		// school.put("高三3班",stus3);
		
		
		
		// 16 从键盘获取一行输入字符串，要求去除重复字符。
		Scanner scanner = new Scanner(System.in);
		// String src;
		// System.out.println("请输入一个字符串:");
		// src = scanner.next();
		// Set<Character> s1 = new HashSet<>();
		// for(int i =0;i<src.length();i++)
		// {
		// s1.add(src.charAt(i));
		// }
		// for(Character c:s1)
		// {
		// System.out.print(c);
		// }
		// System.out.println();
		// 17 把List集合
		// 使用Colloctions 放入 "A","BB","ABC","C" ,"A","B","BC","AAA"
		// 把list中的 重复元素去除
		// List<String> l2 = new LinkedList<String>();
		// Collections.addAll(l2, "A", "BB", "ABC", "C", "A", "B", "ABC",
		// "AAA");
		// Set<String> s2 = new HashSet<String>();
		// for (String s : l2) {
		// s2.add(s);
		// }
		// System.out.println(s2);

		// 18 编写这样一个程序，该程序创建了在某一字符串中出现的字符索引（即，哪个字符出现在字符串中的哪个地方）。从命令行读取该字符串。
		// 例如，运行该程序,显示如下:
		// 请输入一串字符:
		// Hello world
		// 查找结果:
		// {d=[9],o=[4,6],r=[7],w=[5],H=[0],l=[2,3,8],e=[1]}
		String str1;
		System.out.println("请输入一个字符串:");
		str1 = scanner.next();
		Map<Character, List<Integer>> result = new TreeMap();
		for(int i=0;i<str1.length();i++)
		{
			// 取出字符
			char c = str1.charAt(i);
			
			// 判断容器中有没有
			List<Integer> list = result.get(c);
			if(list==null)
			{
				list = new ArrayList<>();
			}
			
			// 把当前位置放入
			list.add(i);
			
			// 存入result
			result.put(c, list);
		}
		System.out.println(result);
		
		// 遍历输出
//		for(Character c:result.keySet())
//		{
//			System.out.println(c+"="+result.get(c));
//		}
//		System.out.println(result);

	}
}
